/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.bc;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import org.cip.esymons.general.be.Solicitante;
import org.cip.esymons.general.util.Utiles;
import org.cip.esymons.tesoreria.adapters.AdaptadorDeudaMovimientoAnual;
import org.cip.esymons.tesoreria.adapters.CuotaMensual;
import org.cip.esymons.tesoreria.adapters.DeudaAnual;
import org.cip.esymons.tesoreria.adapters.DeudaMovimiento;
import org.cip.esymons.tesoreria.be.EnumEstadoMovimiento;
import org.cip.esymons.tesoreria.be.EnumTipoDeuda;
import org.cip.esymons.tesoreria.be.MovimientoCuenta;
import org.cip.esymons.tesoreria.be.MovimientoFraccionamiento;

/**
 *
 * @author Gilmar Montoya
 */
public class FraccionamientoTrujillo extends DecoradorFraccionamiento {

    private EntityManager em;
    private Double deuda;

    @Override
    public List<MovimientoCuenta> listaMovimientosCuotas(List<MovimientoCuenta> listaMovimientos, Solicitante solicitante) {
        List<MovimientoCuenta> listaMovimientosCuotas = new ArrayList<MovimientoCuenta>();
        List<MovimientoCuenta> listaMovimientosMultas = new ArrayList<MovimientoCuenta>();
        Double montoMulta = 0.0;
        for (MovimientoCuenta mc : listaMovimientos) {
            if (mc.getTipoDeuda().equals(EnumTipoDeuda.CUOTA_CIP)) {
                listaMovimientosCuotas.add(mc);
            } else {
                montoMulta += mc.getMcuMonto();
                listaMovimientosMultas.add(mc);
            }
        }
        List<MovimientoCuenta> lista = new ArrayList<MovimientoCuenta>();
        List<MovimientoFraccionamiento> listaMovimientosAPagar = new ArrayList<MovimientoFraccionamiento>();
        MovimientoFraccionamiento movFra = new MovimientoFraccionamiento();
        int numCuotas = obtenerNroCuotas();
        int cont = 1;
        if (numCuotas > 0) {
            DeudaAnual deudaAnual = new DeudaAnual();
            deudaAnual.setListaCuotasPorAnio(new AdaptadorDeudaMovimientoAnual(new DeudaMovimiento(listaMovimientosCuotas)).getListaCuotasPorAnio());
            double deudaLocal = 0.0;
            double pivot = Utiles.redondearDouble(((deudaAnual.deudaTotal() + montoMulta) / numCuotas), 2);
            double distancia = pivot;
            int conNumCuotas = 0;
            Calendar cal = Calendar.getInstance();
            cal.setTime(new Date());
            cal.add(Calendar.MONTH, -1);
            List<CuotaMensual> listaCuotasMensuales = new ArrayList<CuotaMensual>();
            listaCuotasMensuales.addAll(deudaAnual.listaEncuotasMensuales());
            for(MovimientoCuenta mc : listaMovimientosMultas){
                CuotaMensual cm = new CuotaMensual();
                cm.setAnio(mc.getMcuAnio());
                cm.setMes(mc.getMcuMes());
                cm.setDeuda(mc.getMcuMonto());
                cm.setCodigoSolicitante(mc.getFkSolCodigo().getSolCodigo());
                cm.getListaMovimientos().add(mc);
                cm.setSeleccionado(true);
                listaCuotasMensuales.add(cm);
            }
            for (CuotaMensual cme : listaCuotasMensuales) {
                distancia = pivot - deudaLocal;
                deudaLocal += cme.getDeuda();
                if (deudaLocal >= pivot && conNumCuotas < numCuotas - 1) {
                    double deudaAux = 0.0;
                    if (distancia < (deudaLocal - pivot)) {
                        deudaLocal -= cme.getDeuda();
                        deudaAux = cme.getDeuda();
                    } else {
                        for (MovimientoCuenta mov : cme.getListaMovimientos()) {
                            movFra = new MovimientoFraccionamiento();
                            movFra.setMovimientoCuenta(mov);
                            movFra.setPorcentaje(100.00);
                            listaMovimientosAPagar.add(movFra);
                        }
                    }
                    conNumCuotas++;
                    cal.add(Calendar.MONTH, 1);
                    cal.set(Calendar.DAY_OF_MONTH, 1);
//                    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
//                    if (cal.get(Calendar.DAY_OF_WEEK) == 0) {
//                        cal.add(Calendar.DAY_OF_MONTH, -1);
//                    }
                    MovimientoCuenta mc = new MovimientoCuenta();
                    mc.setDescripcion("Cuota ".concat(String.valueOf(cont++)));
                    mc.setEstado(EnumEstadoMovimiento.Impaga);
                    mc.setFkCinCodigo(null);
                    mc.setFkSolCodigo(solicitante);
                    mc.setMcuFechvencimiento(cal.getTime());
                    mc.setMcuMes(cal.get(Calendar.MONTH) + 1);
                    mc.setMcuAnio(cal.get(Calendar.YEAR));
                    mc.setMcuMonto(deudaLocal);
                    mc.setMcuSaldo(deudaLocal);
                    mc.setTipoDeuda(EnumTipoDeuda.FRACCIONAMIENTO);
                    mc.setListaMovimientosAPagar(listaMovimientosAPagar);
                    lista.add(mc);
                    deudaLocal = deudaAux;
                    listaMovimientosAPagar = new ArrayList<MovimientoFraccionamiento>();
                    if (deudaAux > 0) {
                        for (MovimientoCuenta mov : cme.getListaMovimientos()) {
                            movFra = new MovimientoFraccionamiento();
                            movFra.setMovimientoCuenta(mov);
                            movFra.setPorcentaje(100.00);
                            listaMovimientosAPagar.add(movFra);
                        }
                    }
                } else {
                    for (MovimientoCuenta mov : cme.getListaMovimientos()) {
                        movFra = new MovimientoFraccionamiento();
                        movFra.setMovimientoCuenta(mov);
                        movFra.setPorcentaje(100.00);
                        listaMovimientosAPagar.add(movFra);
                    }
                }
            }
            conNumCuotas++;
            cal.add(Calendar.MONTH, 1);
            cal.set(Calendar.DAY_OF_MONTH, 1);
//            cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
//            if (cal.get(Calendar.DAY_OF_WEEK) == 0) {
//                cal.add(Calendar.DAY_OF_MONTH, -1);
//            }
            MovimientoCuenta mc = new MovimientoCuenta();
            mc.setDescripcion("Cuota ".concat(String.valueOf(cont++)));
            mc.setEstado(EnumEstadoMovimiento.Impaga);
            mc.setFkCinCodigo(null);
            mc.setFkSolCodigo(solicitante);
            mc.setMcuFechvencimiento(cal.getTime());
            mc.setMcuMes(cal.get(Calendar.MONTH) + 1);
            mc.setMcuAnio(cal.get(Calendar.YEAR));
            mc.setMcuMonto(deudaLocal);
            mc.setMcuSaldo(deudaLocal);
            mc.setTipoDeuda(EnumTipoDeuda.FRACCIONAMIENTO);
            mc.setListaMovimientosAPagar(listaMovimientosAPagar);
            lista.add(mc);
            listaMovimientosAPagar = new ArrayList<MovimientoFraccionamiento>();
            return lista;
        } else {
            return new ArrayList();
        }
    }

    private int obtenerNroCuotas() {
        try {
            return new Integer(em.createQuery("select o.franumCuotas from ConfiguracionFraccionamientoTrujillo as o Where ?1 between o.frarangoIni and o.frarangoFin").setParameter(1, deuda).getSingleResult().toString());
        } catch (Exception ex) {
            return 0;
        }
    }

    /**
     * @return the em
     */
    public EntityManager getEm() {
        return em;
    }

    /**
     * @param em the em to set
     */
    public void setEm(EntityManager em) {
        this.em = em;
    }

    /**
     * @return the deuda
     */
    public Double getDeuda() {
        return deuda;
    }

    /**
     * @param deuda the deuda to set
     */
    public void setDeuda(Double deuda) {
        this.deuda = deuda;
    }
}
